#include"link.h"

// 单链表的创建
Link_list* init_link_list(void)
{
    Link_list* list = (Link_list*)malloc(sizeof(Link_list));
    if (list == NULL) {
        printf("申请内存失败!\n");
        return NULL;
    }
    list->head = NULL;
    list->tail = NULL;
    list->size = 0;
    return list;
}

// 单链表的插入
void insert_tail_node(Link_list* list, Elenemt_data data)//尾差
{
    //新节点申请空间
    Node* new_node = (Node*)malloc(sizeof(Node));
    if (new_node == NULL) {
        printf("申请内存失败!\n");
        return;
    }
//新节点初始化
    new_node->data = data;
    new_node->next = NULL;
//头结点指NULL
    if (list->head == NULL) 
    {
        list->head = new_node;
        list->tail = new_node;
    } 
    else //新节点指向尾部
    {
        list->tail->next = new_node;
        list->tail = new_node;
    }
    list->size++;//结点数加一
}
void insert_node(Link_list* list, Elenemt_data data, int index);

// 单链表的删除
void delete_tail_node(Link_list* list)//尾删
{
    if (list->size == 0) 
    {
        printf("表为空!\n");
        return;
    }
    //只有一个节点
    if (list->head == list->tail) 
    {
        free(list->head);
        list->head = NULL;
        list->tail = NULL;
        list->size--;
        return;
    }
    // 多个节点
        Node * ptr_1 = list->head;
        Node* ptr_2 =ptr_1->next;
        Node* ptr_3 =ptr_2->next;
    for (size_t i = 0; ptr_3 != NULL; i++)
    {
        ptr_1=ptr_1->next;
        ptr_2=ptr_2->next;
        ptr_3=ptr_3->next;
    }
    ptr_1->next=NULL;
free(ptr_2);
ptr_2=NULL;
}
void delete_node(Link_list* list, int index);

// 单链表的查找
Node* find_node_id(Link_list* list, int index);
Node* find_node_name(Link_list* list, char* name);

// 单链表的遍历
void print_link_list(Link_list* list)
{
        Node * ptr = list->head;
    for (size_t i = 0; ptr != NULL; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",
            ptr->data.name , ptr->data.sex , ptr->data.age , 
            ptr->data.sco  , ptr->data.id 
            );
        ptr = ptr->next;
    }
}

// 单链表的判空
int IsEmpty_Sql_List(Link_list* list);

// 单链表的清空
void clear_link_list(Link_list* list);

// 单链表的合并
Link_list* merge_link_lists(Link_list* list1, Link_list* list2);

// 单链表的销毁
// void free_link_list(Link_list ** list)
// {
//     if (NULL==*list)
//     {
//         printf("表未创建");
//         return;
//     }
//     if (NULL==(*list)->head)
//     {
//         printf("表未创建");
//         return;
//     }
    

//     //销毁节点
//     Node*ptr_1=(*list)->next;
//     Node*ptr_2=ptr_1->next;
//     for (size_t i = 0; i <(*list)->size; i++)
//     {
//         free(ptr_1);
//         ptr_1 = ptr_2;
//         if(ptr_2!=NULL)
//             ptr_2 = ptr_2->next;  // 若ptr_2不为空，则继续下一循环
//     }
    


// //头结点销毁
//     free(*list);
//     *list = NULL;
    
// }

void free_link_list(Link_list ** list)
{
    if (NULL == *list)
    {
        printf("链表 为 NULL\n");
        return ;
    }

    // 1 销毁结点
    Node * ptr_1 = (*list)->head;
    Node * ptr_2 = ptr_1->next;
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        // if 判断  判断 ptr2 = NULL 的时候 我们如何处理
        ptr_1 = ptr_2;
        if (NULL != ptr_2)
        {
            ptr_2 = ptr_2->next;
        }
        
    }
    

    // 2 销毁头结点
    free(*list);
    *list = NULL;
}